feat(accounts): add the ISV payout schedule fields and funds_transfer_type on payouts - #653
Conversation
🟢 Risk Classification: LOWApproval route: AI Auto-Approval Classification reasons
Operational gates
Files analysed: 8 wall-e 2026.06.19-02 · policy |
🔬 Debug — why this classification?Each reason code emitted by the classifier, its source clause in the AI in SDLC Control Framework, and what it means.
Kinds:
See issue #3 for the proposal to formalise this map as Appendix A of the standards doc. wall-e 2026.06.19-02 · debug |
There was a problem hiding this comment.
✅ Auto-approved — this PR meets all Low-risk criteria.
All checks passed, no unresolved comments, and the change classification is:
no_low_class_matchedprod_source_modified2.2.6_logical_extension:The change is purely additive, adding new optional fields to existing request/response POJOs on already-existing endpoints without introducing new endpoints, services, persisted data, auth changes, or external integrations.
wall-e 2026.06.19-02 · policy 376219bc71e6…
…_type on payouts From the 2026-08-05 spec. Verified against it with the RAG rather than the ticket text, which turned out to overstate the work. The ISV part is not five new schemas. The payout schedule endpoint gained an anyOf with a SaaS seller variant, and what that variant actually adds on the wire is two fields: balance_minimum, the amount to retain in the sub-entity's available balance, and carry_forward_enabled, whether a balance below the minimum rolls into the next payout. Both go on the request and the response. The ScheduleFrequency*Isv schemas serialise identically to the ones already here: same by_day array, same by_month_day array. Only the accepted values differ, and the API enforces them. Adding parallel classes with identical wire shapes would have doubled the public surface for nothing, so the constraints are documented on the existing classes instead: working days only for ISV weekly and daily, and only [1], [15], [1,15] or [1,16] for ISV monthly. The card payout side is one field, and the ticket points at the wrong half: funds_transfer_type already existed on the payout REQUEST via PaymentInstruction. What was missing is the response, where PaymentInstructionResponse carried only value_date. Two of the four tests cover absence rather than presence. A standard schedule must not emit balance_minimum or carry_forward_enabled at all, since either leaking in as a null or a zero would make the API read it as an ISV schedule, and both must come back null rather than 0/false so a caller can tell "not applicable" from "set to zero". Blocks C and D of the ticket need no work in Java: the hosted payment and payment link responses extend Resource, which already maps _links, and PaymentInstrumentRequest already has label, currency and instrumentDetails. Refs INT-1684.
The field that says where a sub-entity's payout actually goes was missing from both the request and the response, in all seven SDKs, and it never appeared in the swagger changelog, so it predates the point where changes started being tracked. Found while implementing the ISV fields in the same two classes. Riding along in INT-1684 rather than getting its own row: it is one property, and tracking a ticket per property costs more than it returns. Called out here and in the PR so it is not invisible. The doc comment carries the bit that is easy to get wrong: for SaaS sellers it is optional, but when supplied it must reference a verified payment instrument or the API rejects the request. The existing four tests were extended rather than new ones added, including the two that assert absence, since a payout destination leaking into a standard schedule request is the same class of bug as the ISV fields leaking in. Refs INT-1684.
14107c1 to
90e7300
Compare
🟢 Risk Classification: LOWApproval route: AI Auto-Approval Classification reasons
Operational gates
Files analysed: 8 wall-e 2026.06.19-02 · policy |
🔬 Debug — why this classification?Each reason code emitted by the classifier, its source clause in the AI in SDLC Control Framework, and what it means.
Kinds:
See issue #3 for the proposal to formalise this map as Appendix A of the standards doc. wall-e 2026.06.19-02 · debug |
|
There was a problem hiding this comment.
✅ Auto-approved — this PR meets all Low-risk criteria.
All checks passed, no unresolved comments, and the change classification is:
no_low_class_matchedprod_source_modified2.2.6_logical_extension:All changes are purely additive new fields on existing request/response POJOs for already-used endpoints, with no new external integrations, no auth changes, no new persisted data classes, no new endpoints, and no new background processes.
wall-e 2026.06.19-02 · policy 376219bc71e6…



What
Two additions from the 2026-08-05 spec, verified against the spec and against the code before writing anything.
A. SaaS seller (ISV) payout schedules
GET/PUT /accounts/entities/{id}/payout-schedulesgained ananyOfwith a SaaS seller variant. On the wire that is two fields,balance_minimumandcarry_forward_enabled, on both the request and the response. They were missing in all seven SDKs.payment_instrument_idis also added: it was absent from both sides of this schedule, though it is not new in the spec.B.
instruction.funds_transfer_typeon the card payout responseThe field already existed on the payout request. This is the response side, where the instruction carried only
value_date.Tests
The ones that matter here are the negative cases, because getting them wrong is silent:
nullor0, the API would read a standard schedule as an ISV one.nullrather than0/false, so a caller can tell "not applicable" from "set to zero".Not breaking
Purely additive.
Refs INT-1684.